import re
from socket import *
import getpass  # 隐藏输入时的数据，但只支持终端
import sys

from time import sleep

# 服务器地址
ADDR = ("127.0.0.1", 8000)


class TcpView:
    def __init__(self):
        self.__model = TcpHandle()

    # 一级界面
    def display_manue01(self):
        while True:
            print('''
            ╔———————在线词典查询系统————————╗
        │                                              │
        │   =============== 功能菜单 ===============   │
        │                                              │
        │   1 注册用户信息                             │
        │   2 登录用户                             │
        │   3 退出用户系统                             │                           │
        │  ==========================================  │
        │  说明：通过数字键选择菜单          │
        ╚———————————————————————╝
          ''')
            num = input("请输入选项：")
            if num == "1":
                name = input("User：")
                password = getpass.getpass()  # 隐藏输入密码
                self.__model.enrol_infor(name, password)

            elif num == "2":
                name = input("User：")
                password = getpass.getpass()  # 隐藏输入密码
                if self.__model.login_user(name, password):
                    self.display_manue02(name)
                else:
                    print("登录失败")
            elif num == "3":
                self.__model.exit_system()
                sys.exit("谢谢使用")
            else:
                print("请输入正确选项！")

    # 二级菜单
    def display_manue02(self, name):
        while True:
            print("""
            ╔—————Welcome User:%s进入在线词典查询系统———-——╗
        │                                              │
        │   =============== 功能菜单 ===============   │
        │                                              │
        │   1 查单词                             │
        │   2 历史记录                             │
        │   3 注销                             │                           │
        │  ==========================================  │
        │  说明：通过数字键选择菜单          │
        ╚———————————————————————╝
          """ % name)

            num = input("请输入选项：")
            if num == "1":
                self.__model.query_words()
            elif num == "2":
                self.__model.history_info()
            elif num == "3":
                break
            else:
                print("请输入正确选项！")

    def main(self):
        self.display_manue01()


# 发送请求，具体处理

class TcpHandle:
    def __init__(self):
        self.sock = self._create_socket()

    def _create_socket(self):
        sock = socket()
        sock.connect(ADDR)
        return sock

    @staticmethod
    def check(infor):
        pattern = r"^\w{3,12}$"
        if re.search(pattern, infor):
            return True
        else:
            return False

    def enrol_infor(self, name, password):
        '''
         注册要求用户必须填写用户名，密码，其他内容自定
            * 用户名要求不能重复
            * 要求用户信息能够长期保存
        注册成功可以回到一级界面继续登录，也可以直接用注册用户进入二级界面
        :return:
        '''
        if TcpHandle.check(name) and TcpHandle.check(password):
            msg = "ENROL\t%s\t%s" % (name, password)
            self.sock.send(msg.encode())
            response = self.sock.recv(128)
            # print(response.decode())
            if response == b"OK":
                print("注册成功，请登录！")
            else:
                print("该用户名已存在")
        else:
            print("用户名和密码必须符合4-12位普通字符")

    def login_user(self, name, password):
        '''
        * 登录凭借用户名和密码登录
        if登录成功则回到二级界面，否则回到一级界面
        :return:
        '''

        msg = "LOGIN\t%s\t%s" % (name, password)
        self.sock.send(msg.encode())
        result = self.sock.recv(128)
        # print(result.decode())
        if result == b"OK":

            print("恭喜您登录成功！")
            return True
        else:
            return False

    def exit_system(self):
        '''
        退出后即退出该软件
        :return:
        '''
        self.sock.send(b"Exit\t")

    def query_words(self):
        """
        查单词：循环输入单词，得到单词解释，输入特殊符号退出单词查询状态
        :return:
        """
        while True:
            word = input("Word：")
            if word == '##':
                break
            msg = "Query\t" + word
            self.sock.send(msg.encode())
            result = self.sock.recv(1024).decode()
            tmp = result.split("\t")
            if tmp[0] == "T":
                print("%s : %s" % (word, tmp[1]))
            else:
                print("Not Found!\n")

    def history_info(self):
        """
        历史记录：查询当前用户的查词记录，要求记录包含name word time。前10条即可。

        :return:
        """
        self.sock.send(b"History")
        response = self.sock.recv(1024 * 10).decode()
        result = response.split("\t")
        if result[0] == "T":
            for row in result[1].split(";"):
                print(row)  # 每条历史记录
        else:
            print("您还没有查询记录")


if __name__ == '__main__':
    tcp = TcpView()
    tcp.main()
